<?php
/**
 * | @author 韩威兵^life <1877361302@qq.com>
 * +----------------------------------------------------------------------
 * | @copyright 2016 - 2019 HQ
 * +----------------------------------------------------------------------
 * | @version $Id: 2019/4/26 15:13 jiahe_new base.php 韩威兵^life $
 * +----------------------------------------------------------------------
 */

namespace app\common\common\Server;

use app\common\library\token\driver\Redis;
use think\Config;
use think\Log;

class  commonServer {

    //code提示语句
    public static $showMsgArr = [

        '0' => '请求成功',//成功默认消息提醒

        //开始字段，常用的通用代码
        '1' => '测试消息',
        '2' => '参数错误',

        //系统自定义错误
        '500' => '服务器异常',

        //用户模块错误码,
        '10000'=>'登录错误',
        '10001' => '余额不足',
        '10002'=>'用户不存在',

        //订单模块错误码
        '20000'=> '不在早餐时间段',
        '20001'=>'有特殊商品',
        '20002'=>'没有可供使用的早餐卡',
        '20003'=>'旧平台用户不存在',
        '20004' => '下单失败',
        '20005' => '优惠券不可使用',
        '20006' => '确认订单出现错误',

        //商品信息
        '30001' => '商品不存在',

        //结束字段，常用的错误通用字段
        '99997'=>'网络错误',//报错的时候，取得一个默认的值
        '99998'=>'系统维护',//系统维护字段，独享
        '99999' => '未知错误', //code码错误默认提示消息
    ];

    //需要再error自定义展示输出的消息,用哪一个都可以
    public static $lastShowMsg = '';
    public static $showMsg = '';


    /**
     * @param $code   状态码
     * @param array $data  需要传给前端的其他数据
     * @param string $logMsg  需要记录日志的消息，默认是字符串，但是支持数组
     * @return commonServer
     */
    public static function error($code=null,  $data=[], $logMsg=''){
        header( 'Content-Type:text/html;charset=utf-8 ');
        header('Content-type: application/json');

        $objResultWrapper = new self();
        //抛给前段用户的提示消息
        if(!isset(self::$showMsgArr[$code])){
            $showMsg = self::$showMsgArr['99999'];
        }else{
            $showMsg = self::$showMsgArr[$code];
        }
        $lastMsg = $showMsg;

        //如果有日志消息，则记录日志
        if(!empty($logMsg) && is_array($logMsg)){
            $logMsg_str = json_encode($logMsg, JSON_UNESCAPED_UNICODE);
            Log::error($logMsg_str);
        }

        //保证data里面永远都是数组下面是对象
        if(!empty($data) && is_assoc($data)){
            $data = array($data);
        }

        //最后的展示消息，展示自定义的消息
        if(!empty(self::$lastShowMsg)){
            $showMsg = self::$lastShowMsg;
        }elseif(!empty(self::$showMsg)){
            $showMsg = self::$showMsg;
        }

        //判断是测试环境，打印错误消息，否则只记录不打印
        if(config('app_debug')){
            $data[] = ['logMsg'=>$logMsg];
            //$data = array_merge($data, ['logMsg'=>$logMsg]);
        }

        //为了不让提示消息为空，最后有一个娄底的方式
        if(empty($showMsg)){
            $showMsg = $lastMsg;
        }

        echo self::formatData($code, $showMsg, $data, []);

        return $objResultWrapper;
    }

    /**
     * @param array $data  需要传递给前段的数据 ，默认是数组，但是支持字符串
     * @param string $showMsgArr  需要展示的消息，可以为空，为空则去默认值
     * @param array $extend   其他扩展字段，一般可以为空
     * @return commonServer
     */
    public static function success($data=null, $showMsgArr='', $extend=[]){
        header('Content-Type:text/html;charset=utf-8');
        header('Content-type: application/json');
        if(empty($showMsgArr)){
            $showMsgArr = self::$showMsgArr['0'];
        }

        $objResultWrapper = new self();
        if(empty($data)){
            $data = [];
        }

        //保证data里面永远都是数组下面是对象
        if(is_array($data) && !empty($data) && is_assoc($data) ){
            $data = array($data);
        }

        echo self::formatData(0, $showMsgArr, $data, $extend);
        return $objResultWrapper;
    }
    /**
     * 组装数据
     * @param $showMsgArr
     * @param $data
     * @param $extend
     * @return string
     */
    public static function formatData($code, $showMsgArr, $data, $extend){
        $result['code'] = $code;
        $result['msg'] = $showMsgArr;
        $result['data'] = $data;
        //合并扩展字段
        if(!empty($extend) && is_array($extend) && is_assoc($extend)){
            $result = array_merge($result, $extend);
        }
        return  json_encode($result);
    }
    /**
     * 需要断开逻辑的地方，调用该方法
     */
    public function exits(){
        exit;
    }
    /**
     * 需要断开逻辑的地方，调用该方法
     */
    public function dies(){
        die;
    }

    /**
     * 写日志
     * @param $content
     * @param string $logName
     * @param string $dir
     */
    public function writeLog($content, $logName='test', $dir=''){
        //组装目录
        if(empty($dir)){
            $dir = ROOT_PATH.'/runtime/jiahelog/';
        }
        $dir.=date('Y-m').'/';
        //组装文件名
        $name = date('d').'_'.$logName.'.log';
        $file_name = $dir.$name;
        //组装内容
        $data = '# '.date('Y-m-d H:i:s').' @@ ';
        if(is_array($content)){
            $data .= verifiableServer::jsonEncodeChinese($content);
        }else{
            $data .= $content;
        }
        $data .= "\r\n";

        // 使用最大权限0777创建文件
        if (!is_dir($dir)){
            mkdir($dir, 0777);
        }

        file_put_contents($file_name, $data, FILE_APPEND);
        return false;
    }

    /**
     * 获取redis实例
     * @param int $database
     * @return \Redis
     */
    public static function getRedis($database = 0){
        $config = Config::get('redis');
        if(empty($database)){
            $database = $config['database'];
        }
        $redis = new \Redis();
        $redis->connect($config['host'], $config['port']);
        $redis->auth($config['auth']);
        $redis->select($database);
        return $redis;
    }



}  